/**
 * author:sen--2012-04-05
 */
(function($) {      
$.fn.mytable = function(o) {
		var cfg = {
				//class name:
				thSelectedClass:"thSelected",
				thClass:"tableHead",
				trSelectedClass:"trSelected",
				trOverClass:"trOver",
				thUpClass:"headerSortUp",
				thDownClass:"headerSortDown",
				evenClass:"even",
				oddClass:"odd",
				//id:
				resetId:"reset",
				queryButtonName:"query",//查询按钮name
				exportButtonName:"export",//导出按钮name
				exportUrl:"",//导出功能请求URL
				formId:"queryForm",
				//
				storageSortColAttr:'id',   //指定用元素的哪个属性来存储排序列名，默认为id
				sortCol:['name','asc'], 				//[0]=要排序的列名--[1]=asc/desc
				reqParam:{},			 				//最终发给服务器的参数。注：不要在调用时配置此参数。
				param:{},//调用时可配置的请求参数
				url:"AddressList-find",
				
				isGo:false, //是否打开页面便立即查询显示mytable
				isCheckBox:true,//前面是否需要checkbox
				enterQuery:true,//是否在文本框内回车就查询
				operateAClass:'operate',//每行的操作按钮的class
				queryInterval:3000,//查询间隔，默认1妙钟，如果无间隔则设置为0
				//分页
				pagination:true,
				pagerId:'pager',
				num_edge_entries: 2,
				num_display_entries: 8,
				items_per_page:50,
				pagesTotal:0,
				
				//当点击查询按钮或按回车mytableLoad后，pagination前调用
				//此回调方法是为了设置总记录数
				afterTableLoad_beforePaginationLoad:function(cfg){},
				
				beforeLoad:function(){},
				query:null,//手动控制查询的回调函数。插件会将cfg传给该函数，查询时调用cfg.queryGo();
				onLoad:null,
				beforeRequest:null,//在请求前的回调函数。插件会将cfg传给该函数。
				afterTableLoad:function(cfg){},
				
				//工具栏
				toolbarDivId:'toolbar',//工具栏id
				rowIdsParam_isString:false,//如果设置为true则工具栏按钮对选中行的id以字符串的形式作参数发送，否则直接发送js数组
				delUrl:'Note-delete',	//删除按钮的请求URL
				toolbar:{
					'delButton':function(rows){
						var r = cfg.publicFunc.myConfirm('您确定删除？',rows);
						if(r==false) {
							return false;
						}
						var ids = r[0];
						var ck = r[1];
						$.post(cfg.delUrl,{rows:rows},function(h){
							try{
								h = eval("("+h+")");
								if(h.success) {
									$(ids,me).remove();
								} else {
									alert("失败。");
								}
							} catch(e){
								alert("失败。"+h);
								$(ck,me).click();
							}
						});
					},
					'modButton':function(rows){
					}
				},
				operate:{//操作栏
//					delItem:{url:"",param:{},confirm:'确定？'},//这里的delItem是操作按钮的name名称。这个传给了mytable一个{}
//					modItem:function(id){//这个传的是一个函数
//					}
					delItem:function(id){
						cfg.publicFunc.selectTr(id);
						cfg.toolbar.delButton(id);
					}
				},
				publicFunc:{
					getTr : function(id){
						return $('tr:[name="'+id+'"]',me);
					},
					selectTr : function(id) {
						if(!cfg.publicFunc.isSelected(id)) {
							$('[name="'+id+'"] :checkbox:eq(0)',me).click();
						}
					},
					unSelectTr:function(id) {
						if(cfg.publicFunc.isSelected(id)) {
							$('[name="'+id+'"] :checkbox:eq(0)',me).click();
						}
					},
					isSelected:function(id) {
						var tr = $('[name="'+id+'"]',me);
						return tr.attr('_selected')=='true';
					},
					myConfirm:function(info,rows,allowEmpty) {
						if(!allowEmpty && rows.length<=0)
        					return false;
			        	var ids = '';
			        	var ck = '';
			        	var rowsArr = rows;
						if(cfg.rowIdsParam_isString) {
							rowsArr=rows.substring(0, rows.length-1);
							rowsArr = rows.split(",");
						}
						for(var i = 0; i < rowsArr.length; i++){
							ids += '[name="'+rowsArr[i]+'"],';
							ck += '[name="'+rowsArr[i]+'"] :checkbox:eq(0),';
						}
						ids=ids.substring(0, ids.length-1);
						ck=ck.substring(0, ck.length-1);
						
						if(!window.confirm(info)) {
							$(ck,me).click();
							return false;
						}
						return [ids,ck];
					}
				},
				me:null,
				datas:{
					form:null,//查询表单
					queryButton:null//查询按钮
				}
		};
		var me = this;
		cfg.me = this;
		me.addClass('mytable');
		//将传来的参数以继承的方式给cfg
		jQuery.extend(true,cfg, o);
		/*******缓存一些数据-------start******/
		cfg.datas.form = $("#"+cfg.formId);
		cfg.datas.queryButton = $("[name='"+cfg.queryButtonName+"']",cfg.datas.form);
		/*******缓存一些数据-------end******/
		//阻止表单的这种形式提交
		if(cfg.formId){
			$('#'+cfg.formId).submit(function(){return false;});
		}
		
		//设置查询间隔功能的函数
		var setupQueryInterval = function(){
			if(cfg.queryInterval<=0){
				return false;
			}
			cfg.datas.queryButton.attr("disabled","disabled");
			setTimeout(function() {
				cfg.datas.queryButton.removeAttr("disabled");
			}, cfg.queryInterval);
		};
		//查询时判断该查询是否正处理间隔中，还不能查询
		var ifQueryInterval = function(){
			if(cfg.datas.queryButton.attr('disabled')=='disabled'){
				return true;
			}
			return false;
		}
		//是否进行分页计算的标识，如果是点击查询按钮或按回车时才进行分页计算
		var isFirstQuery = false;
		//定义ajax请求函数
		var reqMytable = function(){
			setupQueryInterval();
			$("tbody",me).html("<tr><td colspan='10'><img src='jslib/mytable/images/loader.gif' alt='请等待...'' /></td></tr>");
			//添加分页参数
			cfg.reqParam.rowStart = cfg.reqParam.rowStart>0?cfg.reqParam.rowStart:0;
			cfg.reqParam.pageSize = cfg.items_per_page;
			jQuery.extend(true,cfg.reqParam, cfg.param);
			
			//在请求前的回调函数
			if(cfg.beforeRequest != null) {
				if(cfg.beforeRequest(cfg)==false) return false;
			}
			$.post(cfg.url, cfg.reqParam, function(html) {
				//alert(html);
				//更新tbody数据
				$("tbody",me).html(html);
				mytableLoad();
				//数据加裁完成后，如果是点击查询按钮或按回车时才进行分页计算
				if(pagination && isFirstQuery) {
					cfg.afterTableLoad_beforePaginationLoad(cfg);
					pagination();
					isFirstQuery = false;
				}
				cfg.afterTableLoad(cfg);
			});
		}
		
		cfg.queryGo = function() {//-----------------------id....
			if(ifQueryInterval()){
				return false;
			}
			if(cfg.beforeLoad() == false)
				return false;
			isFirstQuery = true;
			//去除表头checkbox的选中状态
			$("th :checkbox:eq(0)",me).attr("checked",false);
			
			if(cfg.formId != '') {
				var p = getParams();
				p['col']=cfg.sortCol[0];
				p['order']=cfg.sortCol[1];
				cfg.reqParam = p;
			}
			reqMytable();

			mytableLoad();

			return false;
		}
		cfg.exportGo = function(){
			//在请求前的回调函数
			if(cfg.beforeRequest != null) {
				if(cfg.beforeRequest(cfg)==false) return false;
			}
			cfg.reqParam.rowStart = 0;
			cfg.reqParam.pageSize = 0;
			var p = jQuery.extend(true,getParams(), cfg.reqParam);
			//生成表单
			var form = $('<form></form>')
			form.attr('action',cfg.exportUrl)
				.attr('method','post');
			for(var k in p){
				var v = p[k];
				var input = $('<input/>');
				input.attr('type','hidden')
					 .attr('name',k)
					 .val(v);
				form.append(input);
			}
			$('body').append(form);
			form[0].submit();
			form.remove();
		}
		//得到表单的json参数
		var getParams = function(){
			var p = {};
			$("#"+cfg.formId + " .isForm").each(function(i){
				var name = $(this).attr('name');
				var val = $(this).val();
				if(name!=''&& val!=''){
					p[name]= val;
				}
			});
			return p;
		};
		var mytableLoad = function(){
			if(!$("tbody tr:eq(0)",me).html) 
				return;
			//每行添加checkbox
			if(cfg.isCheckBox) {
				$("tr:gt(0)",me).each(function(i){
					var xx = "";
					if($(this).attr('checkboxIsDisabled')=='true'){//如果此行的checkbox是禁用的则禁用
						xx = "disabled='disabled'";
					}
					$(this).prepend("<td><input type='checkbox' "+xx+"/></td>");
				});
			}
			//添加斑马线
			$('tr:gt(0):even',me).addClass(cfg.evenClass);
			$('tr:gt(0):odd',me).addClass(cfg.oddClass);
			//tr hover
			$("tr:gt(0)",me).hover(
					function() {
						if (jQuery(this).attr('_selected') != 'true') {
							jQuery(this).removeClass(cfg.evenClass).removeClass(cfg.oddClass).addClass(cfg.trOverClass);
						}
					},
					function() { 
						if (jQuery(this).attr('_selected') != 'true') {
							jQuery(this).removeClass(cfg.trOverClass);
							renewTR(this);
						}
					}
			);
			
			var renewTR = function(o) {
				o.rowIndex%2==0?$(o).addClass(cfg.oddClass):$(o).addClass(cfg.evenClass);
			}
			
			var isAllSelectBox = true;
			var selectedTR = function(o) {   
				//给tr的样式
				if($(o).attr("_selected") =='true'){
					$(o).attr("_selected",'false'); 
					$(o).removeClass(cfg.trSelectedClass);
					renewTR(o);
				} else {
					$(o).attr("_selected",'true');
					$(o).removeClass(cfg.trClass).addClass(cfg.trSelectedClass);
				}

				if(isAllSelectBox) {
					var isC = $(o).children('td:eq(0)').children(':checkbox')[0].checked;
					if(isC)
						$(o).children('td:eq(0)').children(':checkbox')[0].checked = false;
					else
						$(o).children('td:eq(0)').children(':checkbox')[0].checked = true;

				}
				isAllSelectBox = true;
			}
			
			//为非全选checkbox加单击事件
			$("tr :checkbox:gt(0)",me).unbind('click').click(function(){
				isAllSelectBox = false;
				
				//选中行：
				if(!this.disabled) {
					selectedTR($(this).parents('tr')[0]);
				}
			});
			//全选的checkbox的单击事件
			$("tr:eq(0) :checkbox:eq(0)",me).unbind('click').click( function() {
				isAllSelectBox = false;
				$("tr :checkbox:gt(0)",me).click();
			});
			//给操作栏的链接添加事件
			$("a."+cfg.operateAClass,me).unbind('click').click(function(e){
				var tr = $(this).parents('tr');
				var id = tr.attr('name');
				var name = $(this).attr('name');
				
				if(name.indexOf('(')!=-1 && name.indexOf(')')!=-1){
					var funN = name.substring(0,name.indexOf('('));
					var pa = name.substring(name.indexOf('(')+1,name.lastIndexOf(')'));
					eval('cfg.operate.'+funN+'.apply(cfg,['+pa+'])');
					return false;
				}
				var hook = eval('cfg.operate.'+ name);
				if(typeof hook == 'function') {
					hook.apply(cfg,[id]);
				} else if(typeof hook == 'object') {
					if(hook.confirm != null) {
						if(window.confirm(hook.confirm)) {
							var url = hook.url;
							var param = hook.param;
							if(param){
								jQuery.extend(true,param, {rows:id});
							} else {
								param = {rows:id};
							}
							$.post(url,param,function(h){
								var h = eval('('+h+')');
								if(h.success) {
									alert('成功。');
									tr.remove();
								} else {
									alert('失败。'+h.info+'。');
								}
							});
						}
					}
				}
			});
			
			
			if(cfg.onLoad)//---------------回调onload
				cfg.onLoad();
		}//mytableLoad() end------------
		
		mytableLoad();
		
		if(cfg.isGo) {
			if(cfg.query != null) {
				cfg.query(cfg);
			} else {
				cfg.queryGo();
			}
		}
		//查询按钮事件query
		if(cfg.queryButtonName) {
			cfg.datas.queryButton.unbind('click').click(function(e){
				if(cfg.query != null) {
					cfg.query(cfg);
				} else {
					cfg.queryGo();
				}
			});
		}
		//导出按钮事件export
		if(cfg.exportButtonName){
			$("#"+cfg.formId+" [name='"+cfg.exportButtonName+"']").unbind('click').click(function(e){
				cfg.exportGo();
			});
		}
		
		//给mytable下所有th加class
		$("th",me).attr("class",cfg.thClass);
		//给指定排序列增加_sort属性
		$('#'+cfg.sortCol[0]).attr("_sort",cfg.sortCol[1]);
		
		//点查询时因为是已经请求过数据的所以不能直接触发它的click事件，它会去再次请求。
		//所以在这里指定它的class
		//给每一次指定的列和顺序加class
		$('th a['+cfg.storageSortColAttr+'="'+cfg.sortCol[0]+'"]',me)
		.addClass(cfg.sortCol[1]=='asc'?cfg.thUpClass:cfg.thDownClass)
		.parent().removeClass(cfg.thClass)
		.addClass(cfg.thSelectedClass);
		//o为单击表头的a标签
		var u = function(o){
			o.attr('_sort','asc');
			o.parent().removeClass(cfg.thClass).addClass(cfg.thSelectedClass);
			o.removeClass(cfg.thDownClass).addClass(cfg.thUpClass);
			cfg.sortCol[1] = 'asc';
		};
		var d = function(o){
			o.attr('_sort','desc');
			o.parent().removeClass(cfg.thClass).addClass(cfg.thSelectedClass);;
			o.addClass(cfg.thDownClass);
			cfg.sortCol[1] = 'desc';
		};
		var ud = function(o){
			if('asc' == o.attr('_sort')) {
				d(o);
			} else {
				u(o);
			}
		};
		//表头内a 单击事件（即单击文字时）
		$("th > a",me).unbind('click').click(function(){
			//把其它没有被点击的a恢复class
			$(this).parent().siblings().removeClass(cfg.thSelectedClass).addClass(cfg.thClass);
			$(this).siblings().removeClass(cfg.thUpClass).removeClass(cfg.thDownClass).addClass('noneSortA');
			ud($(this));
			cfg.sortCol[0]=$(this).attr(cfg.storageSortColAttr);//升级
			//如果table行数大于1则才请求数据
			if(($(this).parents('table:eq(0)'))[0].rows.length > 1) {
				cfg.reqParam.col = cfg.sortCol[0];
				cfg.reqParam.order = cfg.sortCol[1];
				reqMytable();
			}
		});
		if(cfg.formId != '' && cfg.enterQuery) {
			//给每个text表单加回车事件
			$('#'+cfg.formId + ' :text').unbind('keydown').bind('keydown',function(event) {  
		         if(event.keyCode==13){
		        	if(cfg.query != null) {
						cfg.query(cfg);
					} else {
						cfg.queryGo();
					}
		         }
			});
			
			try{$("#"+cfg.formId + ' :text:eq(0)').focus();}catch(e){}
		}
		//分页插件
		var pagination = function() {
			if(cfg.pagination) {
				$('#'+cfg.pagerId).pagination(cfg.pagesTotal, {
					num_edge_entries: cfg.num_edge_entries,
					num_display_entries: cfg.num_display_entries,
					items_per_page: cfg.items_per_page,
					callback: function(page_id, jq) {
						//将开始行和页大小作为请求参数
						cfg.reqParam.rowStart = page_id*cfg.items_per_page;
						cfg.reqParam.pageSize = cfg.items_per_page;
						reqMytable();
			     	}
			    });
			}
		};
		//在还没查询时就显示分页
		pagination();
		
		//注册工具栏按钮点击事件
		$('#'+cfg.toolbarDivId+' button').click(function(e){
			//执行工具栏按钮前先得到选中行的id
			var rows;
			if(cfg.rowIdsParam_isString) {
				rows = '';
			} else {
				rows = [];
			}
        	$("tr:[_selected='true']",me).each(function(i){
        		var t = $(this).attr('name').split(',');
        		if(cfg.rowIdsParam_isString) {
        			rows += t[0]+",";
	        		if(t[1] && t[1] != '')
	        		rows += t[1]+",";
				} else {
					rows[rows.length] = t[0];
	        		if(t[1] && t[1] != '')
	        		rows[rows.length] = t[1];
				}
        	});
			//调用工具栏按钮
			cfg.toolbar[this.name].apply(cfg,[rows]);
		});
};
})(jQuery);